/*
 * Orchard暴露了许多您可以挂钩的事件来执行任何操作。这些事件通常采用您实现接口的形式，
 * 然后Orchard将调用您的实现（因此，不是.NET风格的事件）。我们已经在PersonPartHandler中看到了一个示例，
 * 但这里有一个更像事件处理程序的事件处理程序，关于登录事件。
 *
 * 主要功能：
 * - 实现登录表单事件处理
 * - 在用户登录时显示问候消息
 * - 演示Orchard Core事件系统的使用
 * - 展示通知服务的集成
 */

using Microsoft.AspNetCore.Mvc.Localization;
using OrchardCore.DisplayManagement.Notify;
using OrchardCore.Users;
using OrchardCore.Users.Events;
using System;
using System.Threading.Tasks;

namespace Lombiq.TrainingDemo.Events;

/// <summary>
/// 登录问候事件处理程序 - 实现登录表单事件处理
/// 
/// 主要用途：
/// - 实现登录表单事件处理
 /* - 在用户登录时显示问候消息
 * - 演示Orchard Core事件系统的使用
 * - 展示通知服务的集成
 * 
 * 使用场景：
 * - 用户登录成功后显示欢迎消息
 * - 处理登录失败事件
 * - 处理账户锁定事件
 * - 自定义登录流程
 * 
 * 设计原因：
 * - 提供用户友好的登录体验
 * - 演示Orchard Core事件系统的使用
 * - 展示通知服务的集成方式
 * - 实现自定义登录行为
 * 
 * 设计模式：
 * - 事件处理模式：实现ILoginFormEvent接口
 * - 依赖注入模式：通过构造函数注入服务
 * - 通知模式：使用INotifier发送用户消息
 * - 本地化模式：使用IHtmlLocalizer支持多语言
/// </summary>
// ILoginFormEvent暴露登录表单的事件。用于显示登录问候或任何更有用的内容！
// 其余部分相当标准，我们再次使用INotifier。
 */
public class LoginGreeting : ILoginFormEvent
{
    private readonly INotifier _notifier;
    private readonly IHtmlLocalizer H;

    /// <summary>
    /// 构造函数 - 注入所需的服务依赖
    /// </summary>
    /// <param name="notifier">通知服务，用于发送用户消息</param>
    /// <param name="htmlLocalizer">HTML本地化器，用于多语言支持</param>
    public LoginGreeting(INotifier notifier, IHtmlLocalizer<LoginGreeting> htmlLocalizer)
    {
        _notifier = notifier;
        H = htmlLocalizer;
    }

    /// <summary>
    /// 处理账户锁定事件
    /// 
    /// 功能说明：
    /// - 当用户账户被锁定时调用
    /// - 当前实现为空，可根据需要添加逻辑
    /// </summary>
    /// <param name="user">被锁定的用户</param>
    /// <returns>完成的任务</returns>
    public Task IsLockedOutAsync(IUser user) => Task.CompletedTask;

    /// <summary>
    /// 处理登录成功事件
    /// 
    /// 功能说明：
    /// - 当用户成功登录时调用
    /// - 显示个性化的欢迎消息
    /// - 使用通知服务发送成功消息
    /// 
    /// 消息格式：
    /// - 使用本地化字符串"Hi {0}!"
    /// - 将用户名作为参数传递
    /// </summary>
    /// <param name="user">成功登录的用户</param>
    /// <returns>完成的任务</returns>
    public async Task LoggedInAsync(IUser user)
    {
        await _notifier.SuccessAsync(H["Hi {0}!", user.UserName]);

        return;
    }

    /// <summary>
    /// 处理登录进行中事件
    /// 
    /// 功能说明：
    /// - 在用户尝试登录时调用
    /// - 当前实现为空，可根据需要添加验证逻辑
    /// </summary>
    /// <param name="userName">尝试登录的用户名</param>
    /// <param name="reportError">报告错误的回调函数</param>
    /// <returns>完成的任务</returns>
    public Task LoggingInAsync(string userName, Action<string, string> reportError) => Task.CompletedTask;

    /// <summary>
    /// 处理登录失败事件（通过用户名）
    /// 
    /// 功能说明：
    /// - 当用户登录失败时调用
    /// - 当前实现为空，可根据需要添加失败处理逻辑
    /// </summary>
    /// <param name="userName">登录失败的用户名</param>
    /// <returns>完成的任务</returns>
    public Task LoggingInFailedAsync(string userName) => Task.CompletedTask;

    /// <summary>
    /// 处理登录失败事件（通过用户对象）
    /// 
    /// 功能说明：
    /// - 当用户登录失败时调用
    /// - 当前实现为空，可根据需要添加失败处理逻辑
    /// </summary>
    /// <param name="user">登录失败的用户</param>
    /// <returns>完成的任务</returns>
    public Task LoggingInFailedAsync(IUser user) => Task.CompletedTask;
}

// 训练部分结束：事件处理程序

// 下一站：Controllers/ApiController.cs
